package com.copa.l21;

/**
 * @author copa
 * @createDate 2022-04-28 10:31
 * @function 递归法 方法也是同l2的递归法，类似解决
 */
public class Test2 {

    // 这段代码是我一开始想到的...但是对比起来太啰嗦了
//    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//        // 由于list1,list2的节点可能是0，但是java的listnode定义了int，int的值默认为0，所以我用null代表[]，这在leetcode是通过的
//        if (list1 == null && list2 == null) {
//            return null;
//        }
//        if (list1 == null) {
//            // 如果list1为[]
//            return list2;
//        } else if (list2 == null) {
//            // 如果list2为[]
//            return list1;
//        }
//        // 这里设置result
//        ListNode result = new ListNode(list1.val >= list2.val ? list2.val : list1.val);
//        // 如果list1或者list2未遍历完，就进去
//        if (list1 != null || list2 != null) {
//            if (list1.val >= list2.val) {
//                // 如果 list1.val >= list2.val 则list2指针往右移
//                list2 = list2.next;
//            } else {
//                // 如果 list1.val < list2.val 则list1指针往右移
//                list1 = list1.next;
//            }
//            result.next = mergeTwoLists(list1, list2);
//        }
//        return result;
//    }

    // 这个我感觉对于像我这样的水平来说...很难想起来...还不用定义临时变量...
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 这里若list1或list2遍历完直接返回
        if (list1 == null || list2 == null) {
            return list1 == null ? list2 : list1;
        }
        if (list1.val >= list2.val) {
            // 如果 list1.val >= list2.val 则list2指针往右移并递归
            list2.next = mergeTwoLists(list1, list2.next);
            return list2;
        } else {
            // 如果 list1.val < list2.val 则list1指针往右移
            list1.next = mergeTwoLists(list1.next, list2);
            return list1;
        }
    }

    public static void main(String[] args) {
        ListNode list1 = new ListNode(1);
        list1.next = new ListNode(2);
        list1.next.next = new ListNode(4);
        ListNode list2 = new ListNode(1);
        list2.next = new ListNode(3);
        list2.next.next = new ListNode(4);
        ListNode listNode = new Test2().mergeTwoLists(list1, list2);
        while (listNode != null) {
            System.out.print(listNode.val + "\t");
            listNode = listNode.next;
        }
    }
}
